﻿using System;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            double a = 1.35;
            double b = 1.65;
            int a1 = Convert.ToInt32(a);
            int a2 = (int)a;
            int b1 = Convert.ToInt32(b);
            int b2 = (int)b;
            Console.WriteLine("{0}使用convert方法转化的结果为：{1}", a, a1);
            Console.WriteLine("{0}使用int强制转换的结果为：{1}", a, a2);
            Console.WriteLine("{0}使用convert方法转化的结果为：{1}", b, b1);
            Console.WriteLine("{0}使用int强制转换的结果为：{1}", b, b2);
            Console.ReadKey();
        }
    }
}
/*
 
C# 中对 double 类型的数据取整，可以使用 convert.toint32() 方法，也可使用 int 强制转换为整数，使用 int 时并不存在四舍五入的情况，而是直接将后面的小数位数丢掉。 

 */

/*
 
Convert.ToInt32() 与 int.Parse() 的区别
没搞清楚 Convert.ToInt32 和 int.Parse() 的细细微区别时千万别乱用，否则可能会产生无法预料的结果，举例来说：假如从 url 中取一个参数 page 的值，我们知道这个值是一个 int，所以即可以用 Convert.ToInt32(Request.QueryString["page"])，也可以用 int.Parse(Request.QueryString["page"])，但是如果 page 这个参数在 url 中不存在，那么前者将返回 0，0 可能是一个有效的值，所以你不知道 url 中原来根本就没有这个参数而继续进行下一下的处理，这就可能产生意想不到的效果，而用后一种办法的话没有 page 这个参数会抛出异常，我们可以捕获异常然后再做相应的处理，比如提示用户缺少参数，而不是把参数值当做 0 来处理。

(1) 这两个方法的最大不同是它们对 null 值的处理方法： Convert.ToInt32(null) 会返回 0 而不会产生任何异常，但 int.Parse(null) 则会产生异常。

(2) 对数据进行四舍五入时候的区别

 a. Convert.ToInt32(double value) 如果 value 为两个整数中间的数字，则返回二者中的偶数；即 3.5 转换为 4，4.5 转换为 4，而 5.5 转换为 6。不过 4.6 可以转换为 5，4.4 转换为 4 。
 b. int.Parse("4.5") 直接报错:"输入字符串的格式不正确"。
 c. int(4.6) = 4 Int 转化其他数值类型为 Int 时没有四舍五入，强制转换。
(3) 对被转换类型的区别 int.Parse 是转换 String 为 int, Convert.ToInt32 是转换继承自 Object 的对象为 int 的(可以有很多其它类型的数据)。你得到一个 object 对象, 你想把它转换为 int, 用 int.Parse 就不可以, 要用 Convert.ToInt32。 

 */

/*
 
浅谈 string 转 int 与抛异常

string 字符串类型和 int 也是可以转换的。下一行的代码给出错误的转换方法。

string a = "123";  // 将a设置为字符串“123”
int x = (int) a;   // 转换
上述代码，毋庸置疑，肯定是错误的。VS 在编译时就过不了。那么，string 该怎么转换成 int 呢？

这里，我们需要用到 int.Parse()，核心代码为：

string a = "123";     // 将a设置为字符串“123”
int x = int.Parse(a); // 转换
如果仅仅是这样，是没有问题的，但是，我们下面再来做一个实例。

用户输入一个数字，而电脑将计算出这个数字加上1以后的答案，并且显示出来。

用户输入的东西，即 Console.ReadLine() ，一定是以字符串形式表现的。

于是，运用之前的方法，我们可以写出以下的代码：

class 测试
{
    static void Main(string[] args)
    {
        Console.WriteLine("输入数字，将计算出它加一的答案");
        int a = int.Parse(Console.ReadLine());  //转换用户输入的数字
        Console.WriteLine("答案是{0}",++a);     //++a 即 a+1 后的那个数，将它输出出来
        Console.ReadKey();
    }
}
当程序运行时，会出现：

输入数字，将计算出它加一的答案
3
答案是4
这样就很完美了吗？不！！

如果用户输入并非数字的其他字符，如汉字，会发生什么情况？

此时，用户输入 王 ，显然，程序将无法继续运行下去，因为int类型只能存整数，不能存字符。

这时，程序就会抛出异常。

如果用 VS 编，你还会看到异常类型：FormatException。

所以，为了保险，可以用try、catch来解决此问题。核心代码为：

try
{
               
}
catch (Exception)
{
                
}
try 在英语中就是尝试的意思。在这段代码中，try{} 部分，顾名思义，也就是去尝试进行下面的代码。catch{} 部分，则是检测异常。这样，在出现异常时，catch 就能捕获到异常，从而程序并不会停止。

则这段程序，完整的代码应该为：

using System;
class 测试
{
    static void Main(string[] args)
    {
        try
        {
           Console.WriteLine("输入数字，将计算出它加一的答案");
           int a = int.Parse(Console.ReadLine());   //有可能会抛出异常
           Console.WriteLine("答案是{0}",++a);   //如果没有异常，程序才会进入这一步
        }
        catch (Exception)
        {
            Console.WriteLine("无法转换");  //如果捕获到异常，就说“无法转换”
        }
         Console.ReadKey();
    }
}
这样，如果我输入了 王 ，程序结果为：

无法转换 

 */


/*
 
 1）对于转换对象，Convert.ToInt32() 可以为多种类型（例出数字类型外 bool，DateTime 等），int.TryParse() 和 int.Parse() 只能是整型字符串类型（即各种整型 ToString() 之后的形式，不能为浮点型，否则 int.Parse() 就会出现输入的字符串格式不正确的错误，int.TryParse() 也会返回 false，输出参数为 0 ，(int)只能是数字类型（例 float,int,uint等）；

2）对于空值 NULL，从运行报错的角度讲，(int) 强制转换和 int.Parse() 都不能接受 NULL；Convert.ToInt32() 其实是在转换前先做了一个判断，参数如果为 NULL，则直接返回 0，否则就调用 int.Parse() 进行转换，int.TryParse() 其实是对 int.Parse() 做了一个异常处理，如果出现异常则返回 false，并且将输出参数返回 0；

3）针对于浮点型的取舍问题，浮点型只有 Convert.ToInt32() 和 (int) 能进行转换，但是也是进行取舍了的，Convert.ToInt32() 采取的取舍是进行四舍五入，而 (int) 则是截取浮点型的整数部分，忽略小数部分，例如 Convert.ToInt32(1.499d) 和 (int)1.499d 都返回 1，Convert.ToInt32(1.5d) 返回 2，而 (int)1.5d 还是返回 1；

4）关于溢出，将大的数据类型转换为小的数据类型时 Convert.ToInt32() 和 int.Parse() 都会报溢出错误，值对于 Int32 太大或太小，而 (int) 不报错，但是返回值为 -1。

如此可见，我们在进行数据转换前选择转换方法要谨慎，如果是数字类型可以考虑直接用(int)强制转换，如果是整型字符串类型的，考虑用 int.Parse() 进行转换，如果不是这两种类型，再考虑用 Convert.ToInt32() 进行转换。
 
 */